Če hočemo dobro razumeti delovanje pogojnih stavkov, je dobro, da najprej
razumemo, kaj so logični izrazi. Logični izrazi
imajo lahko le dve vrednosti. Lahko so ali resnični
(v Pythonu to označujemo s
True) ali pa neresnični (v Pythonu to označujemo s False).
Vrednosti True in False sta tipa boolean (Boolovi vrednosti).
Poglejmo si nekaj primerov.
>>> 3 > 1
True
>>> 4 <= 4
True
>>> 5 == 5
True
>>> 7 < 6
False
>>> a = 10
>>> b = 1
>>> a > b
True
Tako vidimo, da ima vsak izmed izrazov lahko le eno izmed dveh vrednosti (True ali False).
Logične izraze tvorimo s pomočjo primerjalnih operatorjev
kot so je
enako (==), ni enako
(!=), večje (>), manjše (<),
večje ali enako (>=) in manjše
ali enako (<=).
Prav tako pa vrednost True ali False predstavlja kakšen ne matematičen izraz ali funkcija.
To vidimo v spodnjem primeru za vsebovanost v nizu, ki jih bomo spoznali
kasneje v sklopu o nizih. Tudi funkcija
isinstance nam vrne Boolovo
vrednost.
>>> 'a' in 'rabarbara'
True
>>> isinstance('kolo', str)
True
To znanje nam bo prišlo prav kasneje pri razumevanju pogojnih stavkov.
Več logičnih izrazov oz. izrazov, ki predstavljajo logični vrednosti True ali False,
pa lahko med seboj povežemo s pomočjo logičnih operatorjev.
Najbolj znanih so in (and),
ali (or) in ne (not).
Poglejmo si nekaj primerov.
>>> (3 < 4) and (4 < 5)
True
>>> True and False
False
>>> ('a' in 'rabarbara') or (5 < 1)
True
>>> not True
False
>>> (True and True) or (True and False)
True
Vidimo da, naprimer operator and vrne True le, če sta obe vrednosti enaki
True. Operator or pa vrne True, če je vsaj ena vrednost enaka True.
Logični izrazi - naloge
Poglejte si še naslednje primere in poskušajte razumeti,
zakaj imajo izrazi take vrednosti, kot jih imajo.
1. podnaloga
Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.
((3 == 3) and (4 != 5)) and (5 <= 4)
Uradna rešitev
((3 == 3) and (4 != 5)) and (5 <= 4)
True
2. podnaloga
Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.
not False
Uradna rešitev
not False
True
3. podnaloga
Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.
(not False and not False) and (True or False)
Uradna rešitev
(not False and not False) and (True or False)
True
4. podnaloga
Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.
('a' in 'rabarbara') and isinstance(3, str)
Uradna rešitev
('a' in 'rabarbara') and isinstance(3, str)
False
5. podnaloga
Sestavite funkcijo stevilo_vnukov(st), ki kot argument st sprejme število
vnukov in vrne True, če je to število enako $3$ in False, če to število ni
enako $3$.
Primer:
>>> stevilo_vnukov(23)
False
Uradna rešitev
def stevilo_vnukov(st):
"""Funkcija vrne True, če je število st enako 3, in False sicer."""
return st == 3
Pogojni stavek - razlaga
V Pythonu pogojni stavek izgleda nekako takole:
if pogoj:
ukaz1A
ukaz1B
...
else:
ukaz2A
ukaz2B
...
Pogojni stavek delimo na dva bloka. Prvi blok z delom if se izvede, kadar je
pogoj izpolnjen (ko ima pogoj vrednost True se izvedejo ukazi ukaz1A,
ukaz1B, ...). Če pogoj ni izpolnjen, se izvede drugi blog z delom else
(če ima pogoj vrednost False, se izvedejo ukaziukaz2A,ukaz2B, ...).
Ukazi morajo biti obvezno zamaknjeni vsi enako in bolj zamaknjeni od vrstice
z delomif, da urejevalnik ve, kam kaj spada.
Oba bloka se ne moreta izvesti. Če se izvede prvi blok, drugega preskočimo,
če pa preskočimo prvi blok, se avtomatično izvede drugi blok.
Paziti moramo še na dvopičje za pogojem in dvopičje zaelse`.
Poglejmo si primer. Vsak mesec dobimo $1000$ evrov plače.
Imamo funkcijo koliko_nakazali(placa), ki kot argument sprejme število
placa, ki je enako znesku nakazanemu na naš bančni račun.
def koliko_nakazali(placa):
"""Funkcija sprejme znesek nakazila in nam vrne niz, v katerem nam pove,
ali smo dobili zadosten znesek."""
if placa < 1000:
niz = 'Nakazilo je bilo prenizko!'
else:
niz = 'Nakazilo je bilo ustrezno.'
return niz
>>> koliko_nakazali(1000)
'Nakazilo je bilo ustrezno'
>>> koliko_nakazali(234)
'Nakazilo je bilo prenizko!'
Ker v prvem primeru pogoj ni bil izpolnjen, se je izvedel drugi blok
ukazov in funkcija je vrnila niz 'Nakazilo je bilo ustrezno.'.
V drugem primeru je bil pogoj izpolnjen, zato se je izvedel le prvi
blok ukazov in funkcija je vrnila niz 'Nakazilo je bilo prenizko!'.
Za pogojni stavek ni nujno, da vedno sestoji iz obeh blokov. Prvi blok je vedno obvezen, torej
tisti del, kjer piše if in za tem pogoj, ter vsaj en ukaz, ki mu sledi, če je pogoj izpolnjen.
Za drugi del ni nujno, da se pojavi. Tako lahko isto funkcijo napišemo na način, da nas opozori
le, če je bilo nakazilo prenizko.
def koliko_nakazali(placa):
"""Funkcija sprejme znesek nakazila in nam vrne niz, v katerem nam pove,
če nismo dobili zadostnega zneska."""
niz = ''
if placa < 1000:
niz = 'Nakazilo je bilo prenizko!'
return niz
>>> koliko_nakazali(1000)
''
>>> koliko_nakazali(234)
'Nakazilo je bilo prenizko!'
Pogojni stavek - naloge
1. podnaloga
Naslednja koda vsebuje, kar se zamikov tiče, cel kup napak.
x = int(input('x: '))
y = int(input('y: '))
if x == 3 and y == 4:
print("x je 3")
print("y je morda 4, vem pa ne")
if x > 2 and y < 5:
print("x > 2")
print("y < 5")
if x < 4 and y > 3:
print("x < 4")
print("y > 3")
Popravite napake! Stavkov samih ne spreminjajte, le njihove zamike.
Popravki morajo biti taki, da so izpisi smiselni.
Uradna rešitev
x = int(input('x: '))
y = int(input('y: '))
if x == 3 and y == 4:
print("x je 3")
print("y je morda 4, vem pa ne")
if x > 2 and y < 5:
print("x > 2")
print("y < 5")
if x < 4 and y > 3:
print("x < 4")
print("y > 3")
2. podnaloga
Janezek nabira gobe. Ker ga je babica dobro podučila, da se gob,
ki jih ne poznaš, ne nabira, nabira le jurčke in lisičke.
Jurčka lahko na tržnici proda za $5$ evrov, lisičko pa za $1$ evro. Ker
ima Janezek slab spomin, cene kar naprej pozablja. Napišite funkcijo
cena_gob(vrsta, st), ki sprejme vrsto gobe in število gob ter vrne ceno vseh
gob skupaj. Če goba ni ne lisička ne jurček, naj funkcija vrne niz 'Ne prodajaj!'.
def cena_gob(vrsta, st):
"""Sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj.
Če Janezek gobe ne pozna, funkcija vrne niz »Ne prodajaj!«."""
if (vrsta != 'jurcek') and (vrsta != 'lisicka'):
return 'Ne prodajaj!'
if vrsta == 'jurcek':
cena = 5
else:
cena = 1
return cena * st
3. podnaloga
Napišite funkcijo kaksno_st(st), ki sprejme število st.
Če je število sodo, funkcija vrne niz 'sodo', če pa je liho, vrne niz 'liho'.
>>> kaksno_st(3)
liho
>>> kaksno_st(2)
sodo
Uradna rešitev
def kaksno_st(st):
"""Sprejme število `st` in vrne niz 'sodo', če je število sodo, sicer pa niz 'liho'."""
if st % 2 == 0:
niz = 'sodo'
else:
niz = 'liho'
return niz
4. podnaloga
Ugodna sobna temperatura se giblje nekje med $22$ in $24$ stopinjami Celzija.
Napišite funkcijo temperatura(izmerjena), ki sprejme izmerjeno temperaturo
izmerjena in vrne niz 'ugodna', če je temperatura med $22$ in $24$
stopinj, sicer pa vrne niz 'neugodna'.
def temperatura(izmerjena):
"""Sprejme temperaturo izmerjena in vrne niz 'ugodna', če je
izmerjena med 22 in 24, sicer vrne niz 'neugodna'."""
if 22 <= izmerjena <= 24:
niz = 'ugodna'
else:
niz = 'neugodna'
return niz
Gnezdenje pogojnih stavkov - razlaga
Včasih nas ne zanima le, če je goba lisička ali jurček. Babica je Janezka naučila
prepoznati še mušnico in veliki dežnik. Veliki dežniki stanejo $2$ evra,
mušnice pa so strupene, zato si je napisal naslednji program.
def cena_gob(vrsta, st):
"""Sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj. Če je vrsta
gobe mušnica, vrne niz 'Goba je strupena!' Če Janezek gobe ne pozna, funkcija vrne
niz 'Ne prodajaj!'"""
if vrsta == 'jurcek':
cena = 5
else:
if vrsta == 'lisicka':
cena = 1
else:
if vrsta == 'velikideznik':
cena = 2
else:
if vrsta == 'musnica':
return 'Goba je strupena!'
else:
return 'Ne prodajaj!'
return cena * st
Kot lahko vidimo, se da znotraj enega pogojnega stavka uporabiti še drugega in tako naprej.
Pri tem moramo biti še vseeno pozorni na pravilno zamikanje. Kar je znotraj enega bloka,
mora biti zamaknjeno. Če se znotraj enega bloka pojavi nov blok, je ta ponovno še bolj
zamaknjen.
Ker pa se tak način pisanja pojavlja pogosto, se da gnezdenje pogojnih stavkov
napisati še na en način. Pri naslednji funkciji, ki dela enako kot prejšnja, bodite
pozorni na uporabo elif.
def cenaGob(vrsta, st):
"""Sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj. Če je vrsta
gobe mušnica, vrne niz 'Goba je strupena!' Če Janezek gobe ne pozna, funkcija vrne
niz 'Ne prodajaj!'"""
if vrsta == 'jurcek':
cena = 5
elif vrsta == 'lisicka':
cena = 1
elif vrsta == 'velikideznik':
cena = 2
elif vrsta == 'musnica':
return 'Goba je strupena!'
else:
return 'Ne prodajaj!'
return cena * st
Z uporabo elif se torej združita else prejšnjega pogojnega stavka in if naslednjega pogojnega
stavka znotraj prejšnjega else. Z uporabo tega pripomočka se izognemo prekomernemu zamikanju kode.
Pri uporabi elif se izvede blok pri prvemu pogoju, ki je zadoščen, ostale bloke pa se preskoči.
Gnezdenje pogojnih stavkov - naloge
1. podnaloga
Ugodna sobna temperatura se giblje nekje med $22$ in $24$ stopinjami Celzija. Napišite
funkicijo temperatura(izmerjena), ki sprejme izmerjeno temperaturo izmerjena
in vrne niz 'ugodno', če je temperatura med $22$ in $24$ stopinjami, 'prevroče', če je
temperatura nad $24$ stopinjami in 'premrzlo', če je temperatura pod $22$ dtopinjami.
def temperatura(izmerjena):
"""Sprejme temperaturo izmerjena in vrne niz 'ugodno', če je
temperatura med 22 in 24, niz 'prevroče', če je nad 24, in niz 'premrzlo',
če je temperatura pod 22-imi stopinjami."""
if izmerjena > 24:
niz = 'prevroče'
elif izmerjena >= 22:
niz = 'ugodno'
else:
niz = 'premrzlo'
return niz
2. podnaloga
Napišite funkcijo kaksno_st(st), ki sprejme število st. Če je število deljivo
z dve, funkcija vrne niz '2', če je število deljivo s tri funkcija vrne niz '3',
če pa je število deljivo z dve in s tri, funkcija vrne niz '2 in 3'. Če število st
ni deljivo z nobenim od teh dveh števil, funkcija vrne niz '1'.
>>> kaksno_st(10)
'2'
>>> kaksno_st(6)
'2 in 3'
Uradna rešitev
def kaksno_st(st):
"""Sprejme število st in vrne niz '2 in 3', če je število deljivo s 6, ali
niz '2' če je deljivo samo z 2, ne pa tudi s 3, ali niz '3', če je deljivo
samo s 3, ne pa tudi z 2, sicer vrne '1'."""
if (st % 2 == 0) and (st % 3 == 0):
niz = '2 in 3'
elif st % 2 == 0:
niz = '2'
elif st % 3 == 0:
niz = '3'
else:
niz = '1'
return niz